#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/msg.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
#include <time.h>
#define BUFSZ 256
//进程自定义的键盘中断信号处理函数原型
typedef void (*sighandler_t) (int);
void sigcat(void);
//建立或获取ipc的一组函数的原型说明
/*
* get_ipc_id() 从/proc/sysvipc/文件系统中获取IPC的id号
* pfile: 对应/proc/sysvipc/目录中的IPC文件分别为
* msg-消息队列,sem-信号量,shm-共享内存
* key: 对应要获取的IPC的id号的键值
*/
int get_ipc_id(char *proc_file,key_t key);
/*
 * set_shm函数建立一个具有n个字节 的共享内存区
 * 如果建立成功,返回 一个指向该内存区首地址的指针shm_buf
 * 输入参数:
 * shm_key 共享内存的键值
 * shm_val 共享内存字节的长度
 * shm_flag 共享内存的存取权限
 */
char *set_shm(key_t shm_key,int shm_num,int shm_flag);
/*
 * set_msq函数建立一个//进程自定义的键盘中断信号处理函数
 * 如果建立成功,返回 一个消息队列的标识符msq_id
 * 输入参数:
 * msq_key 消息队列的键值
 * msq_flag 消息队列的存取权限
 */
int set_msq(key_t msq_key,int msq_flag);
/*
 * set_sem函数建立一个具有n个信号灯的信号量
 * 如果建立成功,返回 一个信号灯数组的标识符sem_id
 * 输入参数:
 * sem_key 信号灯数组的键值
 * sem_val 信号灯数组中信号灯的个数
 * sem_flag 信号等数组的存取权限
 */
int set_sem(key_t sem_key,int sem_val,int sem_flag);
/*
 * 信号灯上的PV操作
 * semid:信号灯数组标识符
 * semnum:信号灯数组下标
 * buf:操作信号灯的结构
 */
int P(int sem_id);
int V(int sem_id);
void ipc_init(void);
/*信号灯控制用的共同体*/
typedef union semuns {
int val;
} Sem_uns;
/* 消息结构体*/
typedef struct msgbuf {
long mtype;
char mtext[1];
} Msg_buf;
//放材料的容器有关的变量
int buff_num;//缓冲区长度
char * tobacco;	//T容器
char * paper;	//P容器
char * glue;	//G容器
/*int * pput_t;	//供应者放T产品的位置指针
int * pput_p;	//供应者放P产品的位置指针
int * pput_g;	//供应者放G产品的位置指针
int * cget_t;	//消费者取T产品的位置指针
int * cget_p;	//消费者取P产品的位置指针
int * cget_g;	//消费者取G产品的位置指针*/
//供应者的信号量
int TP_Psyn_sem;
int PG_Psyn_sem;
int GT_Psyn_sem;
int TP_Pmtx_sem;
int PG_Pmtx_sem;
int GT_Pmtx_sem;
//吸烟者的信号量
int TP_Csyn_sem;
int PG_Csyn_sem;
int GT_Csyn_sem;
int TP_Cmtx_sem;
int PG_Cmtx_sem;
int GT_Cmtx_sem;
//运行程序需要的其他变量
int rate;//睡眠秒数
